'''
copyright: Copyright (C) 2015-2024, Wazuh Inc.

           Created by Wazuh, Inc. <info@wazuh.com>.

           This program is free software; you can redistribute it and/or modify it under the terms of GPLv2

type: integration

brief: These tests will check if the `enabled` option of the Vulnerability Detector module
       is working correctly. This option is located in its corresponding section of
       the `ossec.conf` file and allows enabling or disabling this module.

components:
    - vulnerability_detector

suite: general_settings

targets:
    - manager

daemons:
    - wazuh-modulesd
    - wazuh-db
    - wazuh-analysisd

os_platform:
    - linux

os_version:
    - Arch Linux
    - Amazon Linux 2
    - Amazon Linux 1
    - CentOS 8
    - CentOS 7
    - Debian Buster
    - Red Hat 8
    - Ubuntu Focal
    - Ubuntu Bionic

references:
    - https://documentation.wazuh.com/current/user-manual/capabilities/vulnerability-detection/index.html
    - https://documentation.wazuh.com/current/user-manual/reference/ossec-conf/vuln-detector.html#enabled

tags:
    - general_settings
    - settings
    - vulnerability
    - vulnerability_detector
'''
import pytest
from pathlib import Path

from wazuh_testing.constants.daemons import ANALYSISD_DAEMON, MODULES_DAEMON, SYSCHECK_DAEMON
from wazuh_testing.constants.paths.logs import WAZUH_LOG_PATH
from wazuh_testing.utils.callbacks import generate_callback
from wazuh_testing.tools.monitors.file_monitor import FileMonitor
from wazuh_testing.utils.configuration import get_test_cases_data, load_configuration_template
from wazuh_testing.modules.modulesd.vulnerability_detector import patterns as cb
from wazuh_testing.modules.modulesd.configuration import MODULESD_DEBUG
from wazuh_testing.modules.monitord.configuration import MONITORD_ROTATE_LOG
from . import TEST_CASES_PATH, CONFIGURATIONS_PATH


pytest.skip("The tests will be deprecated, they test the old Vulnerability Detector.", allow_module_level=True)

# Variables
local_internal_options = {MODULESD_DEBUG: '2', MONITORD_ROTATE_LOG: '0'}
daemons_handler_configuration = {'daemons': [ANALYSISD_DAEMON, MODULES_DAEMON, SYSCHECK_DAEMON]}
pytestmark = [pytest.mark.server]

# Configuration and cases data
configurations_path = Path(CONFIGURATIONS_PATH, 'configuration_enabled.yaml')
cases_path = Path(TEST_CASES_PATH, 'cases_enabled.yaml')

# Enabled test configurations
configuration_parameters, configuration_metadata, case_ids = get_test_cases_data(cases_path)
configurations = load_configuration_template(configurations_path, configuration_parameters,
                                             configuration_metadata)


@pytest.mark.tier(level=0)
@pytest.mark.parametrize('test_configuration, test_metadata', zip(configurations, configuration_metadata),
                         ids=case_ids)
def test_enabled(test_configuration, test_metadata, set_wazuh_configuration, truncate_monitored_files,
                 configure_local_internal_options, daemons_handler):
    '''
    description: Check that vulnerability detector is started when is set enabled yes or no.

    test_phases:
        - setup:
            - Set a custom Wazuh configuration.
            - Configure custom local_internal_options.
            - Truncate wazuh logs.
            - Restart wazuh-modulesd daemon to apply configuration changes.
        - test:
            - Check in the log that the vulnerability detector deactivated module does not appear.
        - teardown:
            - Truncate wazuh logs.
            - Restore initial configuration, both ossec.conf and local_internal_options.conf.

    wazuh_min_version: 4.2.0

    tier: 0

    parameters:
        -test_configuration:
            type: dict
            brief: Wazuh configuration data. Needed for set_wazuh_configuration fixture.
        - test_metadata:
            type: dict
            brief: Wazuh configuration metadata.
        - set_wazuh_configuration:
            type: fixture
            brief: Set the wazuh configuration according to the configuration data.
        - configure_local_internal_options:
            type: fixture
            brief: Set local_internal_options configuration.
        - truncate_monitored_files:
            type: fixture
            brief: Truncate all the log files and json alerts files before and after the test execution.
        - daemons_handler:
            type: fixture
            brief: Restart the wazuh-modulesd daemon.

    assertions:
        - Verify that when the `enabled` option is set to `yes`, the Vulnerability Detector module is running.
        - Verify that when the `enabled` option is set to `no`, the Vulnerability Detector module is not running.

    input_description:
        - The `test_enabled.yaml` file provides the module configuration for this test.

    expected_output:
        - r'.*wazuh-modulesd:vulnerability-detector.*Module disabled. Exiting...'
    '''
    file_monitor = FileMonitor(WAZUH_LOG_PATH)

    file_monitor.start(callback=generate_callback(regex=cb.VDT_MODULE_DISABLED))
    if test_metadata['enabled'] == 'yes':
        assert file_monitor.callback_result is None, f"Unexpected '{cb.VDT_MODULE_DISABLED}' event was found."
    else:
        assert file_monitor.callback_result is not None, f"Unexpected '{cb.VDT_MODULE_DISABLED}' event was found."
